package raf;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
 * RAF读写基本类型数据，以及基于指针的读写操作
 * @author 范传奇
 *
 */
public class RAFDemo3 {
	public static void main(String[] args) throws IOException {
		RandomAccessFile raf = new RandomAccessFile("raf.dat","rw");
		/*
		 * long getFilePointer()
		 * 获取当前面RAF的指针位置
		 */
		long pos = raf.getFilePointer();
		System.out.println("pos:"+pos);//0
		
		/*
		 * 将int最大值写入文件
		 * int最大值的2进制:
		 *                            vvvvvvvv
		 * 01111111 11111111 11111111 11111111
		 * 
		 * max>>>24                   vvvvvvvv
		 * 00000000 00000000 00000000 01111111
		 * 
		 * raf.dat
		 * 01111111 11111111 11111111 11111111 01111111 11111111 11111111 11111111 00...
		 */
		int max = Integer.MAX_VALUE;
		raf.write(max>>>24);
		System.out.println("pos:"+raf.getFilePointer());
		raf.write(max>>>16);
		raf.write(max>>>8);
		raf.write(max);
		System.out.println("pos:"+raf.getFilePointer());//4
		/*
		 * RAF提供了方便直接写出基本类型的方法
		 */
		raf.writeInt(max);//连续写4个字节，将int值写出，等同上面4句
		System.out.println("pos:"+raf.getFilePointer());//8
		raf.writeLong(123L);//连续写8个字节，将long值写出
		System.out.println("pos:"+raf.getFilePointer());//16
		raf.writeDouble(123.123);
		System.out.println("pos:"+raf.getFilePointer());//24
		System.out.println("写出完毕!");
		
		/*
		 * void seek(long pos)
		 * 移动指针到指定位置
		 */
		//将指针移动到文件开始
		raf.seek(0);
		System.out.println("pos:"+raf.getFilePointer());//0
		/*
		 * RAF也提供了方便读取基本类型数据的方法
		 * int readInt()
		 * 连续读取4字节，还原对应的int值
		 */
		int d = raf.readInt();
		System.out.println(d);
		System.out.println("pos:"+raf.getFilePointer());//4
		
		//读取后面的long值
		//1先将指针移动到long第一个字节的位置
		raf.seek(8);
		//2连续读取8字节还原long值
		long lon = raf.readLong();
		System.out.println(lon);//123
		System.out.println("pos:"+raf.getFilePointer());//16
		
		//读取后面的double值
		double dou = raf.readDouble();
		System.out.println(dou);
		System.out.println("pos:"+raf.getFilePointer());//24
		
		/*
		 * 修改long值为666
		 */
		//1先将指针移动到long第一个字节的位置
		raf.seek(8);
		//2重新写入8字节，将整数666对应的2进制的8个字节写入文件覆盖原内容
		raf.writeLong(666);
		System.out.println("pos:"+raf.getFilePointer());//16
		
		raf.seek(8);
		lon = raf.readLong();
		System.out.println(lon);
		
		
		raf.close();
	}
}






